<!doctype html>
<html lang="zh-CN">
<head><meta name="generator" content="Hexo 3.8.0">
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=11,IE=10,IE=9,IE=8">
    <meta name="baidu-site-verification" content="dIcXMeY8Ya">
    
    <title>Intel CPU 上使用 pmu-tools 进行 TopDown 分析 | OSKernelLAB</title>
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0">
    <meta name="keywords" content="gatieme, 成坚, 内核, linux, kernel">
    <meta name="description" content="内核杂谈">

    
    <link rel="alternative" href="/atom.xml" title="OSKernelLAB" type="application/atom+xml">
    
    
    <link rel="icon" href="/favicon.ico">
    
    <link rel="stylesheet" href="/css/style.css?v=1615735433107">
    <!--[if lt IE 9]>
    <script src="/js/html5.js"></script>
    <![endif]-->
    
<script>
    var _hmt = _hmt || [];
    (function() {
        var hm = document.createElement("script");
        hm.src="https://hm.baidu.com/hm.js?1a8f9a67050c5fdb4c73cbbc00124bd8"
        var s = document.getElementsByTagName("script")[0];
        s.parentNode.insertBefore(hm, s);
    })();
</script>


</head>
</html>
<body class="home">
    <!--[if lt IE 9]>
    <div class="browsehappy">
        当前网页 <strong>不支持</strong>
        你正在使用的浏览器. 为了正常的访问, 请 <a href="http://browsehappy.com/">升级你的浏览器</a>.
    </div>
    <![endif]-->

    <!-- 博客头部 -->
    <header class="header">
    <section class="container header-main">
        <div class="logo">
            <a href="/">
                <div class="cover">
                    <span class="name">OSKernelLAB</span>
                    <span class="description">OS内核实验室</span>
                </div>
            </a>
        </div>
        <div class="dropnav iconfont icon-nav" id="JELON__btnDropNav"></div>
        <ul class="menu hidden" id="JELON__menu">
            
            <li rel="/2021/01/24/2021/0127-0001-Topdown_analysis_as_performed_on_Intel_CPU_using_pmu-tools/index.html" class="item ">
                <a href="/" title="首页" class="iconfont icon-home">&nbsp;首页</a>
            </li>
            
            <li rel="/2021/01/24/2021/0127-0001-Topdown_analysis_as_performed_on_Intel_CPU_using_pmu-tools/index.html" class="item ">
                <a href="/archives/" title="归档" class="iconfont icon-archives">&nbsp;归档</a>
            </li>
            
            <li rel="/2021/01/24/2021/0127-0001-Topdown_analysis_as_performed_on_Intel_CPU_using_pmu-tools/index.html" class="item ">
                <a href="/lab/" title="实验室" class="iconfont icon-archives">&nbsp;实验室</a>
            </li>
            
            <li rel="/2021/01/24/2021/0127-0001-Topdown_analysis_as_performed_on_Intel_CPU_using_pmu-tools/index.html" class="item ">
                <a href="/navigation/" title="网址导航" class="iconfont icon-archives">&nbsp;网址导航</a>
            </li>
            
            <li rel="/2021/01/24/2021/0127-0001-Topdown_analysis_as_performed_on_Intel_CPU_using_pmu-tools/index.html" class="item ">
                <a href="/about/" title="关于" class="iconfont icon-staff">&nbsp;关于</a>
            </li>
            
            <li rel="/2021/01/24/2021/0127-0001-Topdown_analysis_as_performed_on_Intel_CPU_using_pmu-tools/index.html" class="item ">
                <a href="/comment/" title="留言" class="iconfont icon-comment">&nbsp;留言</a>
            </li>
            
        </ul>
        <div class="profile clearfix">
            <div class="feeds fl">
                
                
                <p class="links">
                    
                        <a href="https://github.com/gatieme" target="_blank">Github</a>
                        |
                    
                        <a href="https://github.com/gatieme/gatieme.github.io" target="_blank">Hosted by Github Pages</a>
                        
                    
                </p>
                <p class="sns">
                    
                        <a href="https://blog.csdn.net/gatieme" class="csdn" target="_blank"><b>■</b> CSDN 博客</a>
                    
                        <a href="https://www.facebook.com/gatieme" class="qqweibo" target="_blank"><b>■</b> Facebook</a>
                    
                    <a href="javascript: void(0);" class="wechat">
                        <b>■</b>
                        公众号
                        <span class="popover">
                            <img src="/img/wechat_mp.jpg" width="120" height="120" alt="我的微信订阅号">
                            <i class="arrow"></i>
                        </span>
                    </a>
                </p>
                
            </div>
            <div class="avatar fr">
                <img src="/img/gatieme.jpg" alt="avatar" title="Gatieme-(成坚)">
            </div>
        </div>
    </section>
</header>


    <!-- 博客正文 -->
    <div class="container body clearfix">
        <section class="content">
            <div class="content-main widget">
                <!-- 文章页 -->
<!-- 文章 -->
<article class="post article">
    <header class="text-center">
        <h3 class="post-title"><span>Intel CPU 上使用 pmu-tools 进行 TopDown 分析</span></h3>
    </header>
    <p class="post-meta text-center">
        gatieme 发表于
        <time datetime="2021-01-24T10:40:00.000Z">2021-01-24</time>
    </p>
    <div id="JELON__articlePostContent" class="post-content">
        <table>
<thead>
<tr>
<th style="text-align:center">CSDN</th>
<th style="text-align:center">GitHub</th>
<th style="text-align:center">OSKernelLAB</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center"><a href="https://blog.csdn.net/gatieme/article/details/113269052" target="_blank" rel="noopener">紫夜阑珊-青伶巷草</a></td>
<td style="text-align:center"><a href="https://github.com/gatieme/LDD-LinuxDeviceDrivers/tree/master/study/debug/tools/topdown/pmu-tools" target="_blank" rel="noopener"><code>LDD-LinuxDeviceDrivers</code></a></td>
<td style="text-align:center"><a href="https://oskernellab.com/2021/01/24/2021/0127-0001-Topdown_analysis_as_performed_on_Intel_CPU_using_pmu-tools/">Intel CPU 上使用 pmu-tools 进行 TopDown 分析</a></td>
</tr>
</tbody>
</table>
<p><br></p>
<p><a rel="noopener" href="http://creativecommons.org/licenses/by-nc-sa/4.0/" target="_blank"><img alt="知识共享许可协议" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png"></a></p>
<p>本作品采用<a rel="noopener" href="http://creativecommons.org/licenses/by-nc-sa/4.0/" target="_blank">知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议</a>进行许可, 转载请注明出处, 谢谢合作.</p>
<p>因本人技术水平和知识面有限, 内容如有纰漏或者需要修正的地方, 欢迎大家指正, 鄙人在此谢谢啦</p>
<p><br></p>
<h1 id="1-Topdown-amp-PMU-TOOLS-简介"><a href="#1-Topdown-amp-PMU-TOOLS-简介" class="headerlink" title="1 Topdown &amp; PMU-TOOLS 简介"></a>1 Topdown &amp; PMU-TOOLS 简介</h1><hr>
<h2 id="1-1-TopDown-简介"><a href="#1-1-TopDown-简介" class="headerlink" title="1.1 TopDown 简介"></a>1.1 TopDown 简介</h2><hr>
<p>程序的执行效率是完全依赖与 CPU 执行的, 软件的性能优化, 除了通用的一些优化外, 更重要的是软硬协同优化, 充分发挥 CPU 的硬件特性. 因此我们软件上的一些性能问题, 可以在 CPU 执行流程中的某一环直观的显现出来. 但是由于 CPU 的复杂性, 普通用户和软件开发人员很难也很少有经历去弄懂 CPU 架构, 更不用谈从 CPU 架构上理解软件上那一块出现的问题.</p>
<p>如果有一套软硬协同的分析方法, 可以帮助用户快速了解/分析/定界/定位 当前应用在 CPU 上的性能瓶颈, 用户就可以针对当前 CPU 有针对性的修改自己的程序, 以充分利用当前的硬件资源.</p>
<p>因此 Intel 提出了一套软硬协同进行性能分析的更正式的方法. 它称为自上而下的微体系结构分析方法(TMAM) (<a href="https://software.intel.com/sites/default/files/managed/9e/bc/64-ia-32-architectures-optimization-manual.pdf" target="_blank" rel="noopener">&lt;英特尔®64和IA-32架构优化参考手册&gt; 附录B.1</a>). 在这种方法论中, 我们尝试从高层组件(如前端, 后端, 退休, 分支预测器)开始检测导致执行停滞的原因, 并缩小性能低效的根源.</p>
<p><img src="https://raw.githubusercontent.com/gatieme/LDD-LinuxDeviceDrivers/master/study/debug/tools/topdown/pmu-tools/TMAM.png" alt="Intel TOPDOWN-自上而下的微体系结构分析方法"></p>
<p>进行 TOPDOWN 分析的过程通过是一个不断迭代优化的过程, 他的通常流程如下</p>
<ol>
<li><p>确定性能问题的类型;<br>1.1.    我们可以先从高层次的划分中, 先粗粒度的当前性能问题主要问题是在哪个阶段(类型).<br>1.2.    接着从低层次的划分中, 继续明确具体是哪块出的问题.</p>
</li>
<li><p>使用精确事件 PEBS(X86)/SPE(ARM64) 在代码中找到确切的位置;<br>2.1.    如果条件运行, 精确的抓取对应的 PMU 事件, 明确代码中出现问题的原因和位置.</p>
</li>
<li><p>解决性能问题后, 重新开始 1.<br>3.1.    修改代码, 解决性能问题, 然后重新进行 TOPDOWN 分析, 验证修改是否 OK, 看是否还有其他瓶颈或者是否引入其他问题.</p>
</li>
</ol>
<h2 id="1-2-TopDown-资料汇总"><a href="#1-2-TopDown-资料汇总" class="headerlink" title="1.2 TopDown 资料汇总"></a>1.2 TopDown 资料汇总</h2><hr>
<p>Top-down Microarchitecture Analysis Method(TMAM)资料<br>之前介绍过TMAM的具体内容, 在这里对网络上相关的信息和资料做一个汇总：</p>
<ul>
<li>国外资料</li>
</ul>
<p><a href="https://software.intel.com/content/www/us/en/develop/documentation/vtune-cookbook/top/methodologies/top-down-microarchitecture-analysis-method.html" target="_blank" rel="noopener">Tuning Applications Using a Top-down Microarchitecture Analysis Method</a></p>
<p><a href="http://www.cs.technion.ac.il/~erangi/TMA_using_Linux_perf__Ahmad_Yasin.pdf" target="_blank" rel="noopener">Top-down Microarchitecture Analysis through Linux perf and toplev tools</a></p>
<p><a href="https://ieeexplore.ieee.org/document/6844459/metrics#metrics" target="_blank" rel="noopener">A Top-Down method for performance analysis and counters architecture</a></p>
<p><a href="https://doc.itc.rwth-aachen.de/download/attachments/28344675/08.Performance_Analysis_in_a_Nutshell.pdf?version=1&amp;modificationDate=1480665136000&amp;api=v2" target="_blank" rel="noopener">Performance_Analysis_in_a_Nutshell</a></p>
<p><a href="https://indico.cern.ch/event/280897/contributions/1628888/attachments/515367/711139/Top_Down_for_CERN_2nd_workshop_-_Ahmad_Yasin.pdf" target="_blank" rel="noopener">Top Down Analysis Never lost with Xeon® perf. counters</a></p>
<p><a href="https://dyninst.github.io/scalable_tools_workshop/petascale2018/assets/slides/TMA%20addressing%20challenges%20in%20Icelake%20-%20Ahmad%20Yasin.pdf" target="_blank" rel="noopener">How TMA* Addresses Challenges in Modern Servers and Enhancements Coming in IceLake</a></p>
<ul>
<li>国内资料</li>
</ul>
<p><a href="https://decodezp.github.io/2019/02/14/quickwords15-toplev" target="_blank" rel="noopener">几句话说清楚15：Top-Down性能分析方法资料及Toplev使用</a></p>
<p><a href="https://zhuanlan.zhihu.com/column/CArch" target="_blank" rel="noopener">让 CPU 黑盒不再黑盒</a></p>
<h2 id="1-3-PMU-TOOLS-简介"><a href="#1-3-PMU-TOOLS-简介" class="headerlink" title="1.3 PMU-TOOLS 简介"></a>1.3 PMU-TOOLS 简介</h2><hr>
<p>pmu-tools 是 Intel 的 Adni Kleen 开发的帮助用户和开发者在 Intel X86 CPU 下进行 TOPDOWN 分析的开源工具包, 可以定位和分析 CPU Bound 代码的瓶颈, 不能识别其他(Not bound by CPU)代码的瓶颈.</p>
<h1 id="2-PMU-TOOLS-安装"><a href="#2-PMU-TOOLS-安装" class="headerlink" title="2 PMU-TOOLS 安装"></a>2 PMU-TOOLS 安装</h1><hr>
<h2 id="2-1-下载-github-仓库"><a href="#2-1-下载-github-仓库" class="headerlink" title="2.1 下载 github 仓库"></a>2.1 下载 github 仓库</h2><hr>
<figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git clone https:<span class="comment">//github.com/andikleen/pmu-tools</span></span><br></pre></td></tr></table></figure>
<h2 id="2-2-下载-PMU-表"><a href="#2-2-下载-PMU-表" class="headerlink" title="2.2 下载 PMU 表"></a>2.2 下载 PMU 表</h2><hr>
<p>pmu-tools 完成的具体工作就是采集 PMU 数据, 并按照微架构既定的公式计算 topdown 数据, 但是不同的微架构和 CPU 所支持的 PMU 事件是不同的, 因此 pmu-tools提供了一套完成的映射表, 标记不同 CPU 所支持的 PMU 事件映射表, 以及 topdown 如何使用这些 PMU 数据去计算, 参见 <a href="https://download.01.org/perfmon" target="_blank" rel="noopener">Intel 01.day perfmon 下载</a>.</p>
<p>pmu-tools 的工具在第一次运行的时会通过 <code>event_download.py</code> 把本机环境的 PMU 映射表自动下载下来, 但是前提是你的机器能正常连接 01.day 的网络. 很抱歉我司内部的服务器都是不行的, 因此 pmu-tools 也提供了手动下载的方式.</p>
<p>因此当我们的环境根本无法连接外部网络的时候, 我们只能通过其他机器下载实际目标环境的事件映射表下载到另一个系统上, 有点交叉编译的意思.</p>
<ul>
<li>首先获取目标机器的 CPU 型号</li>
</ul>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">printf "GenuineIntel-6-%X\n" $(awk '/model\s+:/ &#123; print $3 ; exit &#125; ' /proc/cpuinfo )</span><br></pre></td></tr></table></figure>
<blockquote>
<p>cpu的型号信息是由 vendor_id/cpu_family/model/stepping 等几个标记的.</p>
<p>他其实标记了当前 CPU 是哪个系列那一代的产品, 对应的就是其微架构以及版本信息.</p>
<p>注意我们使用了 %X 按照 16 进制来打印</p>
<p>注意上面的命令显示制定了 vendor_id 等信息, 因为当前服务器端的 CPU 前面基本默认是 GenuineIntel-6 等.</p>
<p>不过如果我们是其他机器, 最好查看下 cpufino 信息确认.</p>
</blockquote>
<p>比如我这边机器的 CPU 型号为 :</p>
<figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">processor       : <span class="number">7</span></span><br><span class="line">vendor_id       : GenuineIntel`</span><br><span class="line">cpu family      : <span class="number">6</span></span><br><span class="line">model           : <span class="number">85</span></span><br><span class="line">model name      : Intel(R) Xeon(R) Gold <span class="number">6161</span> CPU @ <span class="number">2.20</span>GHz</span><br><span class="line">stepping        : <span class="number">4</span></span><br><span class="line">microcode       : <span class="number">0x1</span></span><br></pre></td></tr></table></figure>
<p>对应的结果就是 <code>GenuineIntel-6-55-4</code>.</p>
<p>我们也可以直接用 <code>-v</code> 打出来 CPU 信息.</p>
<figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ python ./event_download.py  -v</span><br><span class="line"></span><br><span class="line">My CPU GenuineIntel<span class="number">-6</span><span class="number">-55</span><span class="number">-4</span></span><br></pre></td></tr></table></figure>
<ul>
<li>获取 PMU 映射表</li>
</ul>
<p>如果你可以链接网络, 那么这个命令就会把你 <code>host</code> 机器上的 <code>PMU</code> 映射表下载下来. 否则你拿到了 <code>CPU</code> 型号, 那么你可以直接显式指定 <code>CPU</code> 型号来获取.</p>
<figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">$ python ./event_download.py GenuineIntel<span class="number">-6</span><span class="number">-55</span><span class="number">-4</span></span><br><span class="line"></span><br><span class="line">Downloading https:<span class="comment">//download.01.org/perfmon/mapfile.csv to mapfile.csv</span></span><br><span class="line">Downloading https:<span class="comment">//download.01.org/perfmon/SKX/skylakex_core_v1.24.json to GenuineIntel-6-55-4-core.json</span></span><br><span class="line">Downloading https:<span class="comment">//download.01.org/perfmon/SKX/skylakex_matrix_v1.24.json to GenuineIntel-6-55-4-offcore.json</span></span><br><span class="line">Downloading https:<span class="comment">//download.01.org/perfmon/SKX/skylakex_fp_arith_inst_v1.24.json to GenuineIntel-6-55-4-fp_arith_inst.json</span></span><br><span class="line">Downloading https:<span class="comment">//download.01.org/perfmon/SKX/skylakex_uncore_v1.24.json to GenuineIntel-6-55-4-uncore.json</span></span><br><span class="line">Downloading https:<span class="comment">//download.01.org/perfmon/SKX/skylakex_uncore_v1.24_experimental.json to GenuineIntel-6-55-4-uncoreexperimental.json</span></span><br><span class="line">my event <span class="built_in">list</span> /home/chengjian/.cache/pmu-events/GenuineIntel<span class="number">-6</span><span class="number">-55</span><span class="number">-4</span>-core.json</span><br></pre></td></tr></table></figure>
<p>最终 PMU 的映射表文件, 将被保存在 <code>~/.cache/pmu-events</code>. 将此目录打包后, 放到目标机器上解压即可.</p>
<p>当前我们也可以使用 <code>event_download.py -a</code> 下载所有可用的 PMU 事件映射表. 然后通过如下环境变量, 将 PMU 映射手动指向正确的文件.</p>
<figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">export</span> EVENTMAP=~/.cache/pmu-events/GenuineIntel<span class="number">-6</span><span class="number">-55</span><span class="number">-4</span>-core.json</span><br><span class="line"><span class="keyword">export</span> OFFCORE=~/.cache/pmu-events/GenuineIntel<span class="number">-6</span><span class="number">-55</span><span class="number">-4</span>-offcore.json</span><br><span class="line"><span class="keyword">export</span> UNCORE=~/.cache/pmu-events/GenuineIntel<span class="number">-6</span><span class="number">-55</span><span class="number">-4</span>-uncore.json</span><br></pre></td></tr></table></figure>
<p>最后两个 <code>offcore/uncore</code> 的设置是可选的. 或者可以将名称设置为 CPU 标识符(GenuineIntel-FAM-MODEL), 这将覆盖当前 CPU.</p>
<p>另一种方法是显式设置目标机器的 PMU 映射文件存储路径( 注意是在相对于它的 pmu-events 目录中).</p>
<figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">export</span> XDG_CACHE_DIR=/opt/cache</span><br></pre></td></tr></table></figure>
<p>则将从 <code>/opt/cache/pmu-events</code> 中查找对应的映射文件.</p>
<h1 id="3-PMU-TOOLS-使用"><a href="#3-PMU-TOOLS-使用" class="headerlink" title="3 PMU-TOOLS 使用"></a>3 PMU-TOOLS 使用</h1><hr>
<h2 id="3-1-准备工作"><a href="#3-1-准备工作" class="headerlink" title="3.1 准备工作"></a>3.1 准备工作</h2><hr>
<p>特别需要注意的是, pmu-tools 的大多数工作在使用期间都建议我们禁用 NMI watchdog, 并以 root 身份运行.</p>
<p>因为 X86_64 的 NMI_WATCHDOG 使用了一些 PMU 的寄存器, 同时我们在抓取的时候可能耗时过长, 存在出发 NMI_WATCHDOG 的影响.</p>
<figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Consider disabling nmi watchdog to minimize multiplexing</span><br><span class="line">(echo <span class="number">0</span> &gt; /proc/sys/kernel/nmi_watchdog as root)</span><br></pre></td></tr></table></figure>
<p>使用如下命令关闭</p>
<figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">sysctl -p 'kernel.nmi_watchdog=0'</span><br><span class="line"></span><br><span class="line">OR</span><br><span class="line"></span><br><span class="line">echo <span class="number">0</span> &gt; /proc/sys/kernel/nmi_watchdog</span><br></pre></td></tr></table></figure>
<h2 id="3-1-toplev"><a href="#3-1-toplev" class="headerlink" title="3.1 toplev"></a>3.1 toplev</h2><hr>
<p><code>toplev</code> 是一个基于 <code>perf</code> 和 <code>TMAM</code> 方法的应用性能分析工具. 从之前的介绍文章中可以了解到 <code>TMAM</code> 本质上是对 <code>CPU Performance Counter</code> 的整理和加工. 取得 <code>Performance Counter</code> 的读数需要 <code>perf</code> 来协助, 对读数的计算进而明确是 <code>Frondend bound</code> 还是 <code>Backend bound</code> 等等.</p>
<p>在最终计算之前, 你大概需要做三件事:</p>
<ol>
<li>明确 CPU 型号, 因为不同的 CPU, 对应的 PMU 也不一样</li>
<li>读取 TMAM 需要的 perf event 读数</li>
<li>按 TMAM 规定的算法计算, 具体算法在这个 Excel 表格里</li>
</ol>
<p>这三步可以自动化地由程序来做. 本质上 <code>toplev</code> 就是在做这件事.</p>
<p>toplev的Github地址: <a href="https://github.com/andikleen/pmu-tools" target="_blank" rel="noopener">https://github.com/andikleen/pmu-tools</a></p>
<p>另外补充一下, TMAM作为一种Top-down方法, 它一定是分级的. 通过上一级的结果下钻, 最终定位性能瓶颈. 那么toplev在执行的时候, 也一定是包含这个“等级”概念的.</p>
<p>下面是 <code>toplev</code> 使用方法的资料:</p>
<p><a href="https://github.com/andikleen/pmu-tools/wiki/toplev-manual" target="_blank" rel="noopener">toplev manual</a></p>
<p><a href="http://halobates.de/blog/p/262" target="_blank" rel="noopener">pmu-tools, part II: toplev</a></p>
<p>基本上都是由 toplev 的开发者自己写的, 可以作为一个 Quick Start Guide.</p>
<p>首先可以进行 L1 级别的检查</p>
<figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">$ python toplev.py --core S0-C0 -l1 -v --no-desc taskset -c <span class="number">0</span> ./a.out</span><br><span class="line">...</span><br><span class="line">S0-C0    FE             Frontend_Bound:          % Slots          <span class="number">19.2</span> &lt;</span><br><span class="line">S0-C0    BAD            Bad_Speculation:         % Slots           <span class="number">4.6</span> &lt;</span><br><span class="line">S0-C0    BE             Backend_Bound:           % Slots           <span class="number">4.1</span> &lt;</span><br><span class="line">S0-C0    RET            Retiring:                % Slots          <span class="number">72.1</span> &lt;</span><br><span class="line">S0-C0-T0                MUX:                     %               <span class="number">100.0</span></span><br><span class="line">S0-C0-T1                MUX:                     %               <span class="number">100.0</span></span><br></pre></td></tr></table></figure>
<p>接着进行 <code>level2/level3</code> 级别的检查, 最大支持到 level6.</p>
<figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ python toplev.py --core S0-C0 -l2 -v --no-desc taskset -c <span class="number">0</span> ./a.out</span><br><span class="line">$ python toplev.py --core S0-C0 -l3 -v --no-desc taskset -c <span class="number">0</span> ./a.out</span><br></pre></td></tr></table></figure>
<p>toplev 工具是基于 perf 等工具进行采样的, 因此多数这些工作支持的行为, toplev 也是支持的.</p>
<ul>
<li><p>默认情况下, toplev 同时测量内核和用户代码. 如果只对用户代码感兴趣, 则可以使用 <code>--user</code> 选项. 这往往会减少测量噪声, 因为中断被过滤掉了. 还有一个 <code>--kernel</code> 选项用来测量内核代码.</p>
</li>
<li><p>在具有多个阶段的复杂工作负载上, 测量间隔也是有用的. 这可以用 <code>-I xxxi</code> 选项指定, <code>xxx</code> 是间隔的毫秒数. perf 要求时间间隔至少需要 100ms. toplev 将输出每个间隔的测量值. 这往往会产生大量的数据, 所以绘制输出很有必要.</p>
</li>
</ul>
<p>更多详细信息可以参照 topdev 的 help 帮助文档.</p>
<h1 id="4-参考资料"><a href="#4-参考资料" class="headerlink" title="4 参考资料"></a>4 参考资料</h1><hr>
<p><a href="https://easyperf.net/blog/2019/02/09/Top-Down-performance-analysis-methodology" target="_blank" rel="noopener">Top-Down performance analysis methodology</a></p>
<p><br></p>
<ul>
<li><p>本作品/博文 ( <a href="http://blog.csdn.net/gatieme" target="_blank" rel="noopener">AderStep-紫夜阑珊-青伶巷草 Copyright ©2013-2017</a> ), 由 <a href="http://blog.csdn.net/gatieme" target="_blank" rel="noopener">成坚(gatieme)</a> 创作.</p>
</li>
<li><p>采用<a rel="noopener" href="http://creativecommons.org/licenses/by-nc-sa/4.0/" target="_blank"><img alt="知识共享许可协议" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png"></a><a rel="noopener" href="http://creativecommons.org/licenses/by-nc-sa/4.0/" target="_blank">知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议</a>进行许可. 欢迎转载、使用、重新发布, 但务必保留文章署名<a href="http://blog.csdn.net/gatieme" target="_blank" rel="noopener">成坚gatieme</a> ( 包含链接: <a href="http://blog.csdn.net/gatieme" target="_blank" rel="noopener">http://blog.csdn.net/gatieme</a> ), 不得用于商业目的.</p>
</li>
<li><p>基于本文修改后的作品务必以相同的许可发布. 如有任何疑问, 请与我联系.</p>
</li>
</ul>

    </div>
    <p class="eof">-- EOF --</p>
    <p class="post-meta">
        <span class="post-cat">分类：
            <a class="cat-link" href="/categories/技术积累/">技术积累</a>
        </span>
        <span class="post-tags">
            标签：
            
    
        <a href="/tags/linux/" title="linux">linux</a> / 
    
        <a href="/tags/debug/" title="debug">debug</a> / 
    
        <a href="/tags/topdown/" title="topdown">topdown</a>
    

        </span>
    </p>
</article>
<!-- 分享按钮 -->

  <div class="article-share clearfix text-center">
    <div class="share-area">
      <span class="share-txt">分享到：</span>
      <a href="javascript: window.open('http://service.weibo.com/share/share.php?url=' + encodeURIComponent(location.href) + '&title=' + document.title + '&language=zh_cn');" class="share-icon weibo"></a>
      <a href="javascript: alert('请复制链接到微信并发送');" class="share-icon wechat"></a>
      <a href="javascript: window.open('http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url=' + encodeURIComponent(location.href) + '&title=' + document.title);" class="share-icon qqzone"></a>
      <a href="javascript: window.open('http://connect.qq.com/widget/shareqq/index.html?url=' + encodeURIComponent(location.href) + '&desc=Gatieme个人博客&title=' + document.title + '&callback=' + encodeURIComponent(location.href));" class="share-icon qq"></a>
      <a href="javascript: window.open('http://shuo.douban.com/!service/share?href=' + encodeURIComponent(location.href) + '&name=' + document.title + '&text=' + document.title);" class="share-icon douban"></a>
    </div>
  </div>



<!-- 上一篇/下一篇 -->

<div class="article-nav clearfix">
    
    <span class="prev fl">
        上一篇<br>
        <a href="/2021/02/15/2021/0215-0001-Using_FZF_to_Improve_Productivity/">
            
                使用模糊搜索神器 FZF 来提升办公效率
            
        </a>
    </span>
    

    
    <span class="next fr">
        下一篇<br>
        <a href="/2020/11/21/2020/1121-0002-Perfetto_for_linux/">
            
                Perfetto for linux-使用 Perfetto 分析调度问题
            
        </a>
    </span>
    
</div>

<!-- 文章评论 -->

  <script src="/js/comment.js?v=1615735432583"></script>
  <div id="comments" class="comment">
    <!--
    <div class="sign-bar">
      GitHub 已登录!
      <span class="sign-link">登出</span>
    </div>
    <section class="box">
      <div class="com-avatar"><img src="/img/gatieme.jpg" alt="avatar"></div>
      <div class="com-text">
        <div class="main">
          <textarea class="text-area-edited show" placeholder="欢迎评论！"></textarea>
          <div class="text-area-preview"></div>
        </div>
        <div class="switch">
          <div class="switch-item on">编辑</div>
          <div class="switch-item">预览</div>
        </div>
        <div class="button">提交</div>
      </div>
    </section>
    <section class="tips">注：评论支持 markdown 语法！</section>
    <section class="list-wrap">
      <ul class="list">
        <li>
          <div class="user-avatar">
            <a href="/">
              <img src="/img/gatieme.jpg" alt="user-avatar">
            </a>
          </div>
          <div class="user-comment">
            <div class="user-comment-header">
              <span class="post-name">张德龙</span>
              <span class="post-time">2017年12月12日</span>
              <span class="like liked">已赞</span>
              <span class="like-num">2</span>
            </div>
            <div class="user-comment-body">333333</div>
          </div>
        </li>
        <li>
          <div class="user-avatar">
            <a href="/">
              <img src="/img/gatieme.jpg" alt="user-avatar">
            </a>
          </div>
          <div class="user-comment">
            <div class="user-comment-header">
              <span class="post-name">刘德华</span>
              <span class="post-time">2017年12月12日</span>
              <span class="like">点赞</span>
              <span class="like-num">2</span>
            </div>
            <div class="user-comment-body">vvvvv</div>
          </div>
        </li>
      </ul>
      <div class="page-nav">
        <a href="javascript: void(0);" class="item">1</a>
        <a href="javascript: void(0);" class="item">2</a>
        <a href="javascript: void(0);" class="item current">3</a>
      </div>
    </section>
    -->
  </div>
  <script>
  JELON.Comment({
    container: 'comments',
    label: '2021/0127-0001-Topdown_analysis_as_performed_on_Intel_CPU_using_pmu-tools' || '2021/01/24/2021/0127-0001-Topdown_analysis_as_performed_on_Intel_CPU_using_pmu-tools/',
    owner: 'gatieme',
    repo: 'blog_comments',
    clientId: 'cf796c25fcf4369b9295',
    clientSecret: 'c2ecfa50b9914a8fc9655ede7c9e6cf2ff84a70c'
  });
  </script>




            </div>
        </section>
        <!-- 侧栏部分 -->
<aside class="sidebar">
    
    <section class="widget">
        <h3 class="widget-hd"><strong>文章搜索</strong></h3>
        <div class="search-form">
  <form id="searchForm" method="GET" action="https://www.google.com/search" ectype="application/x-www-form-urlencoded" target="_blank" autocomplete="false" onsubmit="javascript: return false;">
    <input id="searchKeyword" type="text" class="form-control" placeholder="输入关键字搜索" autocomplete="false">
    <input id="searchKeywordHidden" type="hidden" name="q">
    <input id="searchButton" class="btn" type="submit" value="搜索">
  </form>
</div>

    </section>
    

    <section class="widget">
        <h3 class="widget-hd"><strong>文章分类</strong></h3>
        <!-- 文章分类 -->
<ul class="widget-bd">
    
    <li>
        <a href="/categories/linux/">linux</a>
        <span class="badge">(0)</span>
    </li>
    
    <li>
        <a href="/categories/hexo/">hexo</a>
        <span class="badge">(0)</span>
    </li>
    
    <li>
        <a href="/categories/qemu/">qemu</a>
        <span class="badge">(0)</span>
    </li>
    
    <li>
        <a href="/categories/debug/">debug</a>
        <span class="badge">(0)</span>
    </li>
    
    <li>
        <a href="/categories/编程珠玑/">编程珠玑</a>
        <span class="badge">(7)</span>
    </li>
    
    <li>
        <a href="/categories/技术积累/">技术积累</a>
        <span class="badge">(3)</span>
    </li>
    
    <li>
        <a href="/categories/内核探秘/">内核探秘</a>
        <span class="badge">(3)</span>
    </li>
    
</ul>
    </section>

    
    <section class="widget">
        <h3 class="widget-hd"><strong>热门标签</strong></h3>
        <!-- 文章标签 -->
<div class="widget-bd tag-wrap">
  
    <a class="tag-item" href="/tags/linux/" title="linux">linux (10)</a>
  
    <a class="tag-item" href="/tags/debug/" title="debug">debug (6)</a>
  
    <a class="tag-item" href="/tags/tools/" title="tools">tools (4)</a>
  
    <a class="tag-item" href="/tags/scheduler/" title="scheduler">scheduler (3)</a>
  
    <a class="tag-item" href="/tags/hexo/" title="hexo">hexo (2)</a>
  
    <a class="tag-item" href="/tags/blog/" title="blog">blog (2)</a>
  
    <a class="tag-item" href="/tags/qemu/" title="qemu">qemu (1)</a>
  
    <a class="tag-item" href="/tags/topdown/" title="topdown">topdown (1)</a>
  
    <a class="tag-item" href="/tags/kernel/" title="kernel">kernel (1)</a>
  
</div>
    </section>
    

    

    
    <!-- 友情链接 -->
    <section class="widget">
        <h3 class="widget-hd"><strong>友情链接</strong></h3>
        <!-- 文章分类 -->
<ul class="widget-bd">
    
        <li>
            <a href="https://blog.csdn.net/gatieme" target="_blank" title="我的 CSDN 博客">CSDN--紫夜阑珊-青伶巷草</a>
        </li>
    
        <li>
            <a href="https://xydh.fun/gatieme" target="_blank" title="我的炫猿导航主页">炫猿导航</a>
        </li>
    
        <li>
            <a href="https://jelon.info" target="_blank" title="Jelon 的博客">Jelon 的博客</a>
        </li>
    
</ul>
    </section>
    
</aside>
<!-- / 侧栏部分 -->
    </div>

    <!-- 博客底部 -->
    <footer class="footer">
    &copy;
    
        2014-2021
    

    <a href="/">紫夜阑珊-青伶巷草</a>
</footer>
<div class="back-to-top" id="JELON__backToTop" title="返回顶部">返回顶部</div>

    <!--博客js脚本 -->
    <!-- 这里放网站js脚本 -->
<script src="/js/main.js?v=1615735433115"></script>

</body>
</html>
